package com.lagou

/*
*
* 用户位置时长统计
* 现有如下数据需要处理：
* 用户ID，位置ID，开始时间，停留时长（分钟）
* UserA,LocationA,8,60
* UserA,LocationA,9,60
* UserB,LocationB,10,60
* UserB,LocationB,11,80
* 样例数据中的数据含义是：用户UserA，在LocationA位置，从8点开始，停留了60钟
* 处理要求： 1、对同一个用户，在同一个位置，连续的多条记录进行合并
* 2、合并原则：开始时间取最早时间，停留时长累计求和
*
* */
case class UserBean(username: String, location: String, startTime: Int, duration: Int)

object LocationTime {
  def main(args: Array[String]): Unit = {
    //封装数据到集合中
    val userInfo: List[UserBean] = List(
      UserBean("UserA", "LocationA", 8, 60),
      UserBean("UserA", "LocationA", 9, 60),
      UserBean("UserB", "LocationB", 10, 60),
      UserBean("UserB", "LocationB", 11, 80)
    )


    //使用Map集合,对List列表数据进行分组
    println("分组")
    val userMap: Map[String, List[UserBean]] = userInfo.groupBy(user => user.username + "-" + user.location)
    userMap.foreach {
      case (k, v) => println(s"key:$k value:$v")
    }

    //对集合进行排序
    println("排序")
    val sortMap: Map[String, List[UserBean]] = userMap.mapValues(_.sortBy(_.startTime))
    sortMap.foreach {
      case (k, v) => println(s"key:$k value:$v")
    }

    //统计结果

    val sumMap: Map[String, List[UserBean]] = sortMap.mapValues(
      userBean => {
        List(UserBean(userBean.head.username, userBean.head.location, userBean.head.startTime, userBean.map(_.duration).sum))
      }
    )
    println("统计结果如下：")

    sumMap.foreach { case (k, v) => println(s"$k,$v") }
  }
}
